package com.homework.ch08;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

/**
 * @author yang
 * @date 2024-03-27
 */
public class BeanUtil {
    /**
     * 创建公共方法，设置任意对象的属性值
     * @param bean  对象
     * @param propertyName 属性名
     * @param value 属性值
     * @throws Exception
     */
    public static void setProperty(Object bean, String propertyName, Object value) throws Exception {
        //获取对象class类
        Class<?> beanClass = bean.getClass();
        //通过 propertyName 获取对象的属性字段
        Field declaredField = beanClass.getDeclaredField(propertyName);
        //突破限制
        declaredField.setAccessible(true);
        //设置对象属性的值
        declaredField.set(bean, value);
    }

    /**
     * 获取任意对象属性值的方法
     * @param bean 对象
     * @param propertyName  属性名
     * @return  属性值
     * @throws Exception
     */
    public static Object getProperty(Object bean, String propertyName) throws Exception {
        //获取 bean 对象的 class 类
        Class<?> beanClass = bean.getClass();
        //获取属性字段
        Field declaredField = beanClass.getDeclaredField(propertyName);
        //突破限制
        declaredField.setAccessible(true);
        //获取属性值
        return declaredField.get(bean);
    }

    /**
     * 复制对象的所有属性的方法
     * @param source 被复制的对象
     * @param target 需要赋值的对象
     * @throws Exception
     */
    public static void copyProperties(Object source,Object target) throws Exception{
        //获得两个对象的 class 对象
        Class<?> sourceClass = source.getClass();
        Class<?> targetClass = target.getClass();
        //获取所有方法
        Field[] sourceFields = sourceClass.getDeclaredFields();
        Field[] targetFields = targetClass.getDeclaredFields();
        //遍历对象，获取source的属性值，对target的属性进行传值
        for (int i = 0; i < sourceFields.length; i++){
            sourceFields[i].setAccessible(true);
            targetFields[i].setAccessible(true);
            targetFields[i].set(target,sourceFields[i].get(source));
        }
    }
}
